package com.teradata.serial.protostuff;

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
import com.teradata.serial.Serial;
import com.teradata.serial.entities.Products;

import java.util.ArrayList;
import java.util.List;

public class ProtostuffSerial extends Serial {


    public byte[] serializeProtoStuffProduct(Products products) {
        if (products == null) {
            return null;
        }
        long start = System.currentTimeMillis();
        Schema<Products> schema = RuntimeSchema.getSchema(Products.class);
        LinkedBuffer buffer = LinkedBuffer.allocate(4096);
        byte[] protostuffObj = ProtostuffIOUtil.toByteArray(products, schema, buffer);
        long end = System.currentTimeMillis();
        this.usedTime = end - start;
        return protostuffObj;
    }

    public Products deserializeProtoStuffDataListToProducts(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        long start = System.currentTimeMillis();
        Schema<Products> schema = RuntimeSchema.getSchema(Products.class);

        Products product = new Products();
        ProtostuffIOUtil.mergeFrom(bytes, product, schema);

        long end = System.currentTimeMillis();
        this.usedTime = end - start;
        return product;
    }


    public List<byte[]> serializeProtoStuffProductsList(List<Products> pList) {
        if (pList == null || pList.size() <= 0) {
            return null;
        }
        long start = System.currentTimeMillis();
        List<byte[]> bytes = new ArrayList<byte[]>();
        Schema<Products> schema = RuntimeSchema.getSchema(Products.class);
        LinkedBuffer buffer = LinkedBuffer.allocate(4096);
        byte[] protostuff = null;
        for (Products p : pList) {
            try {
                protostuff = ProtostuffIOUtil.toByteArray(p, schema, buffer);
                bytes.add(protostuff);
            } finally {
                buffer.clear();
            }
        }
        long end = System.currentTimeMillis();
        this.usedTime = end - start;
        return bytes;
    }

    public List<Products> deserializeProtoStuffDataListToProductsList(
            List<byte[]> bytesList) {
        if (bytesList == null || bytesList.size() <= 0) {
            return null;
        }
        long start = System.currentTimeMillis();
        Schema<Products> schema = RuntimeSchema.getSchema(Products.class);
        List<Products> list = new ArrayList<Products>();
        for (byte[] bs : bytesList) {
            Products product = new Products();
            ProtostuffIOUtil.mergeFrom(bs, product, schema);
            list.add(product);
        }
        long end = System.currentTimeMillis();
        this.usedTime = end - start;
        return list;
    }
}
